﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using com.byt.webcore;
using com.byt.gestor.db.dao;
using com.byt.gestor.db.factory;
using com.byt.gestor.db.mapper;
using com.byt.webcore.utils;
using MYLSOFT.JsonSimple;
using com.byt.suce.db.mapper;
using com.byt.suce.db.factory;
using System.Collections;
using System.Data.Common;
using System.Text;
using System.IO;
using System.Xml;
using com.byt.suce.db.dao;

namespace suce.gestor
{
    /// <summary>
    /// Summary description for Gestor
    /// </summary>
    public class Gestor : ServletBase
    {

        private IPkgGestorServicio DAO = PkgGestorServicioFactory.create();


        protected override void doCommand(com.byt.webcore.ServletBase.Parameters p)
        {
            if (p.command.Equals("IMPORTAR"))
                IMPORTAR(p);
        }

        private void IMPORTAR(ServletBase.Parameters p)
        {
            Connection vuce = null;

            try
            {
                // Leer los pendientes
                vuce = new Connection(AppConfig.getConnection(p, "integrador"));
                vuce.BeginTransaction();

                PkgGestorServicio.PendienteGetlistParam param = DAO.pendienteGetlist(vuce, p.getMap());
                JSONArray ja = Utils.getJSONArrayObject(param.CurOut);
                param.CurOut.Close();

                // Ingresar a SUCE
                StringBuilder sb = new StringBuilder();

                foreach (JSONObject jo in ja)
                {
                    // Guardar el EBXML
                    RegistrarEbxml(p, jo, (byte[])jo["ebxml"]);


                    // Ingresar el flujo
                    PkgWorkflow.InboxInsertParam ins = PkgWorkflowFactory.create().newInboxInsertParam(jo);
                    PkgWorkflowFactory.create().inboxInsert(p.conn, ins);

                    if (sb.Length > 0)
                        sb.Append(",");

                    sb.Append(jo["gestoriddoc"]);
                }

                // Marcar como transferido
                if (sb.Length > 0)
                {
                    PkgGestorServicio.PendienteMarcarTransferidoParam trans = DAO.newPendienteMarcarTransferidoParam();
                    trans.Iddocs = sb.ToString();
                    DAO.pendienteMarcarTransferido(vuce, trans);
                }
            }
            catch
            {
                throw;
            }
            finally
            {
                if (vuce != null)
                    vuce.Close();
            }

        }

        private void RegistrarEbxml(ServletBase.Parameters p, JSONObject transaccion, byte[] ebxml)
        {
            if (ebxml == null)
                return;

            MemoryStream ms = new MemoryStream(ebxml);
            StreamReader sr = new StreamReader(ms);
            StringBuilder sb = new StringBuilder(sr.ReadToEnd());
            sr.Close();

            // Formatear el EBXML
            sb.Replace("vct:", "");
            sb.Replace("vram:", "");

            string s = sb.ToString();
            int pos = s.IndexOf("<suce");
            int pos2 = s.IndexOf(">", pos + 1);
            s = s.Remove(pos + 5, pos2 - pos - 5);

            XmlDocument xml = new XmlDocument();
            xml.LoadXml(s);
            JSONObject joxml = Converter.XmlToJSON(xml);

            //
            // LLamar a los Stored Procedures
            //
            IPkgEbxml eb = PkgEbxmlFactory.create();

            // Solicitante
            JSONObject jo = (JSONObject)((JSONObject)joxml["DocumentHeader"])["PetitionerTradeParty"];
            PkgEbxml.SolicitanteInsertParam persona = eb.solicitanteInsert(p.conn, jo);
            //persona.Solidpersona
            //persona.Repidpersona

            // Empresa
            jo = (JSONObject)joxml["FactoryLocation"];
            PkgEbxml.EmpresaExtranjeraUpdateParam empresa = eb.empresaExtranjeraUpdate(p.conn, jo);
            //empresa.Idpersona

            // Almacen
            jo = (JSONObject)joxml["StorageLocation"];
            PkgEbxml.AlmacenInsertParam almacen = eb.almacenInsert(p.conn, jo);
            //almacen.Almidpersona
            //almacen.Repidpersona

            // Solicitud
            PkgEbxml.SolicitudInsertParam solicitud = eb.newSolicitudInsertParam();
            solicitud.Idsolicitud = Utils.parseInteger(transaccion["idsolicitud"]);
            solicitud.Codiformato = (string)transaccion["codformato"];
            solicitud.Numesolicitud = (string)transaccion["numtarea"];
            solicitud.Idperssoli = persona.Solidpersona;
            solicitud.Idpersrepr = persona.Repidpersona;
            solicitud.Idpersrepr = persona.Repidpersona;
            solicitud.Idemprext = empresa.Idpersona;
            solicitud.Idpersalma = almacen.Almidpersona;
            solicitud.Idpersrepralma = almacen.Repidpersona;
            solicitud.Fechrecepcion = Utils.parseDate((string)transaccion["fechregistro"]);
            eb.solicitudInsert(p.conn, solicitud);
            //solicitud.Idversion

            // Productos


        }


    }
}